如果数据已经存在,java Android Studio SQLite不会将数据插入数据库
我读这篇文章是因为我有同样的问题。我遵循并复制了潘文林的步骤,但我遇到了一个错误nullPointerException
在我的数据库助手中的某个地方。java
public Boolean verifyData(String TABLE_NAME, String id){
String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + id + " = ?";
Cursor res = db.rawQuery(query, null); <------------ LINE 42
if (res.moveToFirst()){
res.close();
return true;
}
res.close();
return false;
}
public long insertData(String name,String surname,String id){
if (verifyData(TABLE_NAME, id)){ <------------ LINE 53
return 0;
}
// set the format to sql date time
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
Date date = new Date();
Date time = new Date();
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_1, dateFormat.format(date));
contentValues.put(COL_2, timeFormat.format(time));
contentValues.put(COL_3, name);
contentValues.put(COL_4, surname);
contentValues.put(COL_5, id);
long result=db.insert(TABLE_NAME, null, contentValues);
return result;
}
在我的主要活动中的某个地方。java
public void AutoAdd(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd 'at' HH:mm:ss");
String currentDateandTime = sdf.format(new Date());
LINE 329 ------> long isInserted = myDb.insertData(theName.getText().toString(), theSur.getText().toString(), theId.getText().toString());
}
Logcat
2021-04-10 09:24:17.889 16707-16707/com.example.AppDraft3 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.AppDraft3, PID: 16707
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.AppDraft3/com.example.AppDraft3.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method '安卓.database.Cursor 安卓.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3654)
at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3806)
at 安卓.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at 安卓.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at 安卓.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:2267)
at 安卓.os.Handler.dispatchMessage(Handler.java:107)
at 安卓.os.Looper.loop(Looper.java:237)
at 安卓.app.ActivityThread.main(ActivityThread.java:8167)
at java.lang.reflect.Method.invoke(Native Method)
at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method '安卓.database.Cursor 安卓.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference
at com.example.AppDraft3.DatabaseHelper.verifyData(DatabaseHelper.java:42)
at com.example.AppDraft3.DatabaseHelper.insertData(DatabaseHelper.java:53)
at com.example.AppDraft3.MainActivity.AutoAdd(MainActivity.java:329)
at com.example.AppDraft3.MainActivity.onCreate(MainActivity.java:86)
at 安卓.app.Activity.performCreate(Activity.java:7963)
at 安卓.app.Activity.performCreate(Activity.java:7952)
at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3629)
# 1 楼答案
您需要添加一行来实例化变量/对象db,例如:
但是,
verifyData
方法正在尝试提取传递的id为“”的记录,因此将始终返回false我相信你应该因此而改变
致:
如果id列被定义为唯一的(它可能应该是唯一的),那么作为方便的insert方法使用
INSERT OR IGNORE
的等价物,它将忽略重复的id并返回值-1,而不插入行(因此不需要verifyData方法)